祭上一次blog已经3个月了,我成为鸽子了...
这道题就跑两遍kmp看毛片就可以解决问题,但是一些小问题由于码力解决较晚。
解决用时1.5h
注意点1.tnt[1]=1!!!!!
注意点2.tnt用完就扔,别memset了
#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define MOD 1000000007
#define pl(a) ((a) % MOD)
#define cl(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
char str[N];
int kmp[N], tnt[N];
ull ans;
void init()
{
cl(str, 0);
cl(kmp, 0);
ans = 1;
}
int main()
{
int T;
scanf("%d", &T);
for (int kkz = 0; kkz < T; kkz++)
{
init();
scanf("%s", str + 1);
tnt[1] = 1;
int lens = strlen(str + 1);
for (int i = 2, j = 0; i <= lens; i++)
{
while (j && str[i] != str[j + 1]) j = kmp[j];
if (str[i] == str[j + 1])
j++;
kmp[i] = j;
tnt[i] = tnt[j] + 1;
}
for (int i = 2, j = 0; i <= lens; i++)
{
while (j && str[i] != str[j + 1]) j = kmp[j];
if (str[i] == str[j + 1])
j++;
while (j * 2 > i) j = kmp[j];
// printf("---T:%d,good:%c,i:%d,j:%d,sum:%d\n", kkz, str[i], i, j, tnt[j]);
ans = pl(ans * (tnt[j] + 1));
}
printf("%llu\n", ans);
}
return 0;
}